<?php

/**
 * LoginForm class.
 * LoginForm is the data structure for keeping
 * user login form data. It is used by the 'login' action of 'SiteController'.
 */
class LoginForm extends CFormModel {

    public $username;
    public $password;
    public $rememberMe;
    private $_identity;

    /**
     * Declares the validation rules.
     * The rules state that username and password are required,
     * and password needs to be authenticated.
     */
    public function rules() {
        return array(
            // username and password are required
            array('username, password', 'required', 'message' => t('MSG_REQUIRED','messages')),
            array('username', 'length', 'max' => 64, 'tooLong' => t('MSG_STRING_TOO_LONG', 'messages')),
            array('password', 'length', 'max' => 30, 'tooLong' => t('MSG_STRING_TOO_LONG', 'messages')),
            // rememberMe needs to be a boolean
            array('rememberMe', 'boolean', 'message' => t('MSG_BOOLEAN', 'messages')),
            // password needs to be authenticated
            array('password', 'authenticate', ),
        );
    }

    /**
     * Declares attribute labels.
     */
    public function attributeLabels() {
        return array(            
            'username'=>t('LBL_USER_USERNAME_OR_EMAIL','authorization'),
            'password'=>t('LBL_USER_PASSWORD','authorization'),
            'rememberMe'=>t('LBL_USER_REMEMBER_ME','authorization'),
        );
    }

    /**
     * Authenticates the password.
     * This is the 'authenticate' validator as declared in rules().
     */
    public function authenticate($attribute, $params) {
        if (!$this->hasErrors()) {
            $this->username = fn_clean_input($this->username);            
            $this->_identity = new UserIdentityDb($this->username, $this->password);
            if ($this->_identity->authenticate() > 0) {
                switch ($this->_identity->errorCode) {
                    case LGConstant::USER_STATUS_NOT_ACTIVE :                        
                        $this->addError('errorMessage', t('MSG_NOT_ACTIVE', 'messages', array('{0}' => 'Account')));
                        break;
                    default :
                        $this->addError('errorMessage', t('MSG_INCORRECT', 'messages', array('{0}' => 'username or password')));
                        break;
                }
            }            
        }
    }

    /**
     * Logs in the user using the given username and password in the model.
     * @return boolean whether login is successful
     */
    public function login() {
        if ($this->_identity === null) {
            $this->_identity = new UserIdentityDb($this->username, $this->password);
            $this->_identity->authenticate();
        }
        if ($this->_identity->errorCode === UserIdentityDb::ERROR_NONE) {
            $duration = $this->rememberMe ? 3600 * 24 * 30 : 0; // 30 days
            Yii::app()->user->login($this->_identity, $duration);
            return true;
        }
        else
            return false;
    }

}
